// type HttpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
// type ResponseType = "json" | "text" | "blob" | "arrayBuffer" | "formData";

// /**
//  * 获取当前用户的认证令牌。
//  * @returns 返回当前用户的认证令牌，如果没有认证令牌则返回 null。
//  */
// const getToken = (): any|undefined => {
//   // 获取 token 的代码根据需求来写。。。
//   return '13233'
// };

// /**
//  * 执行HTTP请求的通用函数。
//  * @param method 请求方法，支持GET、POST、PUT、DELETE和PATCH。
//  * @param url 请求的URL。
//  * @param data 可选，请求的数据。
//  * @param responseType 可选，响应的数据类型，默认为"json"。支持的类型有"json"、"text"、"blob"、"arrayBuffer"和"formData"。
//  * @param headers 可选，请求头信息。
//  * @param noToken 可选，就算本地存储了 Token 也不携带，默认为 false。
//  * @returns 返回一个Promise，解析为请求结果。
//  */
// export async function http(
//   url: string,
//   method: HttpMethod,
//   data?: any,
//   responseType: ResponseType = "json",
//   headers?: HeadersInit,
//   noToken: boolean = false
// ): Promise<any> {
//   const BASE_URL = process.env.API_URL;
//   const AUTH_TOKEN = noToken ? null : getToken();

//   /**
//    * 配置网络请求的初始化参数
//    * @param method 请求方法（如GET、POST等）
//    * @param headers 请求头信息，可以是预设的或用户自定义的
//    * @param data 请求体数据，如果有的话
//    * @param AUTH_TOKEN 认证令牌，如果存在则会添加到请求头中
//    * @returns 返回一个配置好的 RequestInit 对象，可用于fetch等网络请求中
//    */
//   const config: RequestInit = {
//     method,
//     headers: new Headers({
//       "Content-Type": "application/json; charset=utf-8",
//       ...headers,
//       ...(AUTH_TOKEN ? { Authorization: `Bearer ${AUTH_TOKEN}` } : {}),
//     }),
//     ...(data ? { body: data } : {}),
//   };

//   // 如果请求方法需要数据并且数据是对象类型，则序列化数据。
//   // console.log(method,"方式");
//   if (["POST", "PUT", "PATCH"].includes(method) && typeof data === "object") {
//     config.body = JSON.stringify(data);
//   }

//   url = BASE_URL + url;
// //   try {
//     const response = await fetch(url, config).then((res)=>{
//       console.log(res.json(),"数据")
//       return res;
//     });

//     // if (!response.ok) {
//     //   throw new Error(`HTTP error! status: ${response.status}`);
//     // }
//     // console.log(response.json(),url,"结果");
//     // // 根据响应类型处理响应数据
//     // switch (responseType) {
//     //   case "json":
//     //     return response.json();
//     //   case "text":
//     //     return response.text();
//     //   case "blob":
//     //     return response.blob();
//     //   case "arrayBuffer":
//     //     return response.arrayBuffer();
//     //   case "formData":
//     //     return response.formData();
//     //   default:
//     //     throw new Error("Unsupported response type");
//     // }
// //   } catch (error) {
// //     console.error("There was a problem with the fetch operation:", error);
// //     throw error;
// //   }
// }

import { encrypt,decrypt } from './crypto'

const BASE_URL = process.env.API_URL; //接口域名

const REQUEST_IV = process.env.REQUEST_IV; //请求加密解密 iv
const REQUEST_KEY = process.env.REQUEST_KEY; //请求加密解密 key

// GET 封装fetch请求
export function get(uri:string,params={}) {
  // if (!isLogin()) {
  //     window.location.hash = '#/login';
  // };
  // let headers = {
  //     'Accept': 'application/json',
  //     'Content-Type': 'application/json',
  // };
  // headers.Authorization = window.localStorage.getItem('accessToken') || '';
  // let init = {
  //     method: 'POST',
  //     credentials: 'include',
  //     headers: headers,
  //     body: JSON.stringify(params)
  // };

  const init: RequestInit = {
    method: 'GET',
    cache:'no-cache',//不缓存
    headers: new Headers({
      "Content-Type": "application/json; charset=utf-8",
      // ...headers,
      // ...(AUTH_TOKEN ? { Authorization: `Bearer ${AUTH_TOKEN}` } : {}),
    }),
    // ...(params ? { body: params } : {}),
  };
  // if (DEBUG) {
  //     uri = CTX + uri;
  //     init.mode = 'cors';
  // }

  uri = BASE_URL+uri; //组合

  //参数不为空时 加密
  if(Object.keys(params).length > 0){
    var param =  JSON.stringify(params); //对象转为字符串
    var time = Date.now().toString().slice(0, 10);
    var data = encrypt(param,time+REQUEST_KEY,REQUEST_IV);

    uri = uri+'/?key='+data+'&time='+time;
  }

  // console.log(uri,"域名");
  return new Promise(function (resolve, reject) {
      fetch(uri, init)
          .then(checkStatus)
          .then(parseJSON)
          .then(data => {

            //获取成功 且 数据不为空时  解密
            if(data.code === 200 && data.data.key != null){
             data.data = decrypt(data.data.key,data.data.time+REQUEST_KEY,REQUEST_IV);
            }

            resolve(data);
          }).catch(function (ex) {
              reject(ex);
          });
  });
}
// POST 封装fetch请求 
export function post(uri:string, params={}) {
  // if (!isLogin()) {
  //     window.location.hash = '#/login';
  // };
  // let headers = {
  //     'Accept': 'application/json',
  //     'Content-Type': 'application/json',
  // };
  // headers.Authorization = window.localStorage.getItem('accessToken') || '';
  // let init = {
  //     method: 'POST',
  //     credentials: 'include',
  //     headers: headers,
  //     body: JSON.stringify(params)
  // };

  const init: RequestInit = {
    method: 'POST',
    cache:'no-cache',//不缓存
    mode:'cors', //跨域
    headers: new Headers({
      "Content-Type": "application/json; charset=utf-8",
      // ...headers,
      // ...(AUTH_TOKEN ? { Authorization: `Bearer ${AUTH_TOKEN}` } : {}),
    }),
    // ...(params ? { body: params } : {}),
  };

  uri = BASE_URL+uri;
  // console.log(params,Object.keys(params).length,'caishu ');
    //参数不为空时 加密
    if(Object.keys(params).length > 0){
      var param =  JSON.stringify(params); //对象转为字符串
      var time = Date.now().toString().slice(0, 10);
      var data = encrypt(param,time+REQUEST_KEY,REQUEST_IV);
     
      // var form_data = new FormData();
      // form_data.append('key',data);
      // form_data.append('time',time);
      var rk = {key:data,time:time};
       init.body= JSON.stringify(rk);
    }
// console.log(init,"68");
    
  
  return new Promise(function (resolve, reject) {
      fetch(uri, init)
          .then(checkStatus)
          .then(parseJSON)
          .then(data => {
           //获取成功 且 数据不为空时  解密
            if(data.code === 200 && data.data.key != null){
             data.data = decrypt(data.data.key,data.data.time+REQUEST_KEY,REQUEST_IV);
            }
            resolve(data);
          }).catch(function (ex) {
              reject(ex);
          });
  });
}
// 处理请求状态status
function checkStatus(response:any) {
  if (response.status >= 200 && response.status < 300) {
      return response
  } else {
      var error = new Error(response.statusText)
      // error.response = response
      throw error
  }
}

// 处理请求结果response
function parseJSON(response:any) {

  return response.json().then((res:any) => {
      return new Promise((resolve, reject) => {
          resolve(res);
      })
  }).catch(err => {
      console.log(err,'服务器返回错误');
  });
}